home *** CD-ROM | disk | FTP | other *** search
/ IRIX 6.5 Applications 2004 May / SGI IRIX 6.5 Applications 2004 May.iso / dist / java3d.idb / usr / demos / java / j3d / programs / examples / OrientedShape3D / OrientedPtTest.java.z / OrientedPtTest.java
Encoding:
Java Source  |  2003-08-08  |  9.9 KB  |  291 lines

  1. /*
  2.  *    @(#)OrientedPtTest.java 1.10 02/10/21 13:47:48
  3.  *
  4.  * Copyright (c) 1996-2002 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  *
  10.  * - Redistributions of source code must retain the above copyright
  11.  *   notice, this list of conditions and the following disclaimer.
  12.  *
  13.  * - Redistribution in binary form must reproduce the above copyright
  14.  *   notice, this list of conditions and the following disclaimer in
  15.  *   the documentation and/or other materials provided with the
  16.  *   distribution.
  17.  *
  18.  * Neither the name of Sun Microsystems, Inc. or the names of
  19.  * contributors may be used to endorse or promote products derived
  20.  * from this software without specific prior written permission.
  21.  *
  22.  * This software is provided "AS IS," without a warranty of any
  23.  * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
  24.  * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
  25.  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
  26.  * EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES
  27.  * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  28.  * DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN
  29.  * OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
  30.  * FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
  31.  * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
  32.  * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE,
  33.  * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  34.  *
  35.  * You acknowledge that Software is not designed,licensed or intended
  36.  * for use in the design, construction, operation or maintenance of
  37.  * any nuclear facility.
  38.  */
  39.  
  40. import java.applet.Applet;
  41. import java.awt.BorderLayout;
  42. import java.awt.event.*;
  43. import com.sun.j3d.utils.image.TextureLoader;
  44. import com.sun.j3d.utils.applet.MainFrame;
  45. import com.sun.j3d.utils.geometry.ColorCube;
  46. import com.sun.j3d.utils.geometry.Cone;
  47. import com.sun.j3d.utils.geometry.Cylinder;
  48. import com.sun.j3d.utils.geometry.Sphere;
  49. import com.sun.j3d.utils.universe.*;
  50. import javax.media.j3d.*;
  51. import javax.vecmath.*;
  52. import java.io.*;
  53. import java.awt.*;
  54. import com.sun.j3d.utils.behaviors.vp.*;
  55.  
  56. public class OrientedPtTest extends Applet {
  57.  
  58.     // setup font stuff
  59.     private String fontName = "TestFont";
  60.     private String textString = "OrientedShape3D";
  61.     float sl = textString.length();
  62.  
  63.     // paths to texture image files
  64.     private java.net.URL earthImage = null;
  65.     private java.net.URL stoneImage = null;
  66.  
  67.     private SimpleUniverse u;
  68.  
  69.     public BranchGroup createSceneGraph() {
  70.  
  71.     // Create the root of the branch graph
  72.     BranchGroup objRoot = new BranchGroup();
  73.  
  74.         TransformGroup objScale = new TransformGroup();
  75.         Transform3D textMat = new Transform3D();
  76.         // Assuming uniform size chars, set scale to fit string in view
  77.         textMat.setScale(1.2/sl);
  78.         objScale.setTransform(textMat);
  79.  
  80.  
  81.  
  82.     // Create the transform group node and initialize it to the
  83.     // identity.  Enable the TRANSFORM_WRITE capability so that
  84.     // our behavior code can modify it at runtime.  Add it to the
  85.     // root of the subgraph.
  86.     TransformGroup objTrans = new TransformGroup();
  87.     objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  88.     objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
  89.     objRoot.addChild(objTrans);
  90.  
  91.     BoundingSphere bounds =
  92.         new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
  93.  
  94.         Appearance apText = new Appearance();
  95.     Material m = new Material();
  96.         m.setLightingEnable(true);
  97.     apText.setMaterial(m);
  98.  
  99.  
  100.         Appearance apEarth= new Appearance();
  101.         Material mm = new Material();
  102.         mm.setLightingEnable(true);
  103.     apEarth.setMaterial(mm);
  104.  
  105.         Appearance apStone = new Appearance();
  106.     apStone.setMaterial(mm);
  107.  
  108. // create 3D text 
  109.         Font3D f3d = new Font3D(new Font(fontName, Font.PLAIN, 2),
  110.                                 new FontExtrusion());
  111.     Point3f textPt = new Point3f( -sl/2.0f, 3.0f, 0.0f);
  112.         Text3D txt = new Text3D(f3d, textString, textPt); 
  113.         OrientedShape3D textShape = new OrientedShape3D();
  114.         textShape.setGeometry(txt);
  115.         textShape.setAppearance(apText);
  116.  
  117.     textShape.setAlignmentMode(OrientedShape3D.ROTATE_ABOUT_POINT);
  118.     // text is centered around 0, 3, 0.  Make it rotate around 0,5,0
  119.     Point3f rotationPt = new Point3f(0.0f, 5.0f, 0.0f);
  120.     textShape.setRotationPoint(rotationPt);
  121.         objScale.addChild( textShape );
  122.  
  123.     // also add a small Sphere at the rotation point to 
  124.     // show that we are rotating around the right point
  125.     Sphere sphere = new Sphere(0.2f);
  126.     TransformGroup sphereGroup = new TransformGroup();
  127.     Transform3D sphereXform = new Transform3D();
  128.     sphereXform.set(new Vector3f(rotationPt));
  129.     sphereGroup.setTransform(sphereXform);
  130.     sphereGroup.addChild(sphere);
  131.     objScale.addChild(sphereGroup);
  132.  
  133.  
  134.     // Create a simple shape leaf node, add it to the scene graph.
  135.  
  136.     Transform3D cubeMat = new Transform3D();
  137.     TransformGroup cubeTrans = new TransformGroup(cubeMat);
  138.     cubeMat.set(new Vector3d(0.9, 0.0, -1.0));
  139.     cubeTrans.setTransform(cubeMat);
  140.     cubeTrans.addChild(new ColorCube(0.3));
  141.         objTrans.addChild(cubeTrans);
  142.  
  143.         TextureLoader stoneTex = new TextureLoader(stoneImage, new String("RGB"), this);
  144.         if (stoneTex != null) apStone.setTexture(stoneTex.getTexture());
  145.  
  146.      TextureAttributes texAttr = new TextureAttributes();
  147.      texAttr.setTextureMode(TextureAttributes.REPLACE);
  148.      apStone.setTextureAttributes(texAttr);
  149.  
  150.     Transform3D coneMat = new Transform3D();
  151.     TransformGroup coneTrans = new TransformGroup(coneMat);
  152.     coneMat.set(new Vector3d(0.0, 0.0, 0.0));
  153.     coneTrans.setTransform(coneMat);
  154.     coneTrans.addChild(new Cone(.2f, 0.8f,Cone.GENERATE_NORMALS |
  155.                     Cone.GENERATE_TEXTURE_COORDS, apStone));
  156.         objTrans.addChild(coneTrans);
  157.  
  158.         TextureLoader earthTex = new TextureLoader(earthImage, new String("RGB"), this);
  159.         if (earthTex != null) apEarth.setTexture(earthTex.getTexture());
  160.      apEarth.setTextureAttributes(texAttr);
  161.  
  162.     Transform3D cylinderMat = new Transform3D();
  163.     TransformGroup cylinderTrans = new TransformGroup(cylinderMat);
  164.     cylinderMat.set(new Vector3d(-0.9, 0.5, -1.0));
  165.     cylinderTrans.setTransform(cylinderMat);
  166.     cylinderTrans.addChild(new Cylinder(.35f, 2.0f,Cylinder.GENERATE_NORMALS |
  167.                               Cylinder.GENERATE_TEXTURE_COORDS, apEarth));
  168.         objTrans.addChild(cylinderTrans);
  169.  
  170.         objTrans.addChild(objScale);
  171.  
  172.  
  173.  
  174.  
  175.         // Set up the background
  176.         Color3f bgColor = new Color3f(0.05f, 0.05f, 0.5f);
  177.         Background bgNode = new Background(bgColor);
  178.         bgNode.setApplicationBounds(bounds);
  179.         objRoot.addChild(bgNode);
  180.  
  181.         // Set up the ambient light
  182.         Color3f ambientColor = new Color3f(0.1f, 0.1f, 0.1f);
  183.         AmbientLight ambientLightNode = new AmbientLight(ambientColor);
  184.         ambientLightNode.setInfluencingBounds(bounds);
  185.         objRoot.addChild(ambientLightNode);
  186.  
  187.         // Set up the directional lights
  188.         Color3f light1Color = new Color3f(1.0f, 1.0f, 0.9f);
  189.         Vector3f light1Direction  = new Vector3f(1.0f, 1.0f, 1.0f);
  190.         Color3f light2Color = new Color3f(1.0f, 1.0f, 0.9f);
  191.         Vector3f light2Direction  = new Vector3f(-1.0f, -1.0f, -1.0f);
  192.  
  193.         DirectionalLight light1
  194.             = new DirectionalLight(light1Color, light1Direction);
  195.         light1.setInfluencingBounds(bounds);
  196.         objRoot.addChild(light1);
  197.           
  198.         DirectionalLight light2
  199.             = new DirectionalLight(light2Color, light2Direction);
  200.         light2.setInfluencingBounds(bounds);
  201.         objRoot.addChild(light2);
  202.  
  203.         apText.setMaterial(mm);
  204.  
  205.         // Have Java 3D perform optimizations on this scene graph.
  206.         objRoot.compile();
  207.  
  208.     return objRoot;
  209.     }
  210.  
  211.     public OrientedPtTest() {
  212.     }
  213.  
  214.     public OrientedPtTest(java.net.URL earthURL, java.net.URL stoneURL) {
  215.         earthImage = earthURL;
  216.     stoneImage = stoneURL;
  217.     }
  218.       
  219.     public void init() {
  220.         // the paths to the image files for an applet
  221.         if (earthImage == null) {
  222.         try {
  223.             earthImage = new java.net.URL(getCodeBase().toString() +
  224.                           "../images/earth.jpg");
  225.         }
  226.         catch (java.net.MalformedURLException ex) {
  227.             System.out.println(ex.getMessage());
  228.         System.exit(1);
  229.         }
  230.     }
  231.     if (stoneImage == null) {
  232.       try {
  233.           stoneImage = new java.net.URL(getCodeBase().toString() +
  234.                         "../images/stone.jpg");
  235.       }
  236.       catch (java.net.MalformedURLException ex) {
  237.           System.out.println(ex.getMessage());
  238.           System.exit(1);
  239.       }
  240.     }
  241.       
  242.     setLayout(new BorderLayout());
  243.     Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
  244.     add("Center", c);
  245.  
  246.     // Create a simple scene and attach it to the virtual universe
  247.     BranchGroup scene = createSceneGraph();
  248.     u = new SimpleUniverse(c);
  249.  
  250.     // add mouse behaviors to the ViewingPlatform
  251.     ViewingPlatform viewingPlatform = u.getViewingPlatform();
  252.  
  253.         // This will move the ViewPlatform back a bit so the
  254.         // objects in the scene can be viewed.
  255.         u.getViewingPlatform().setNominalViewingTransform();
  256.  
  257.     // add orbit behavior to the viewing platform
  258.     OrbitBehavior orbit = new OrbitBehavior(c, OrbitBehavior.REVERSE_ALL);
  259.     BoundingSphere bounds =
  260.         new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
  261.     orbit.setSchedulingBounds(bounds);
  262.     viewingPlatform.setViewPlatformBehavior(orbit);
  263.  
  264.     u.addBranchGraph(scene);
  265.     }
  266.  
  267.     public void destroy() {
  268.     u.cleanup();
  269.     }
  270.  
  271.     //
  272.     // The following allows OrientedPtTest to be run as an application
  273.     // as well as an applet
  274.     //
  275.     public static void main(String[] args) {
  276.         java.net.URL earthURL = null;
  277.     java.net.URL stoneURL = null;
  278.     try {
  279.         // the paths to the image files for an application
  280.         earthURL = new java.net.URL("file:../images/earth.jpg");
  281.         stoneURL = new java.net.URL("file:../images/stone.jpg");
  282.     }
  283.     catch (java.net.MalformedURLException ex) {
  284.         System.out.println(ex.getMessage());
  285.         System.exit(1);
  286.     }
  287.         
  288.     new MainFrame(new OrientedPtTest(earthURL, stoneURL), 400, 400);
  289.     }
  290. }
  291.